# python_package_summary.py
# Python包的使用方法总结

print("=" * 50)
print("Python包的使用方法总结")
print("=" * 50)

"""
Python包的相关知识点:

1. 什么是Python的包？
   包就是一个文件夹，里面可以存放许多Python的模块（代码文件），
   通过包，在逻辑上将一批模块归为一类，方便使用。
   
   包的优势：
   - 更好的代码组织结构
   - 避免模块名称冲突
   - 提供命名空间管理
   - 方便代码复用和维护

2. __init__.py文件的作用？
   - 标识目录为Python包
   - 包被导入时首先执行的文件
   - 可以包含包的初始化代码
   - 可以控制包的公共接口
   - 可以从子模块导入内容到包命名空间

3. __all__变量的作用？
   - 控制 import * 能够导入的内容
   - 明确指定模块或包的公共接口
   - 隐藏内部实现细节
   - 在模块中控制函数/变量的导入
   - 在包中控制模块的导入

4. Python包导入语法详解：
   - import package.module                # 完整路径导入
   - from package import module           # 导入包中的特定模块
   - from package.module import function  # 导入模块中的特定函数
   - from package import *                # 导入包中__all__定义的所有模块
   - import package.module as alias       # 使用别名导入
"""

# 演示包的各种使用方式:

# 1. 完整导入包中的模块
print("1. 完整导入包中的模块:")
import math_utils.basic_ops
result = math_utils.basic_ops.add(3, 5)
print(f"   math_utils.basic_ops.add(3, 5) = {result}")

# 2. 导入包中的特定模块
print("\n2. 导入包中的特定模块:")
from math_utils import basic_ops
result = basic_ops.subtract(10, 4)
print(f"   basic_ops.subtract(10, 4) = {result}")

# 3. 导入包中的特定函数
print("\n3. 导入包中的特定函数:")
from math_utils.basic_ops import multiply
result = multiply(6, 7)
print(f"   multiply(6, 7) = {result}")

# 4. 导入包中的所有模块（受__init__.py中的__all__控制）
print("\n4. 导入包中的所有模块（受__all__控制）:")
from math_utils import *
result = basic_ops.add(1, 2)
print(f"   basic_ops.add(1, 2) = {result}")
result = advanced_ops.power(2, 3)
print(f"   advanced_ops.power(2, 3) = {result}")

# 5. 查看包的__all__变量
print(f"\n5. 包的__all__变量: {math_utils.__all__}")

# 6. 使用别名导入
print("\n6. 使用别名导入:")
import math_utils.advanced_ops as adv_ops
result = adv_ops.sqrt(25)
print(f"   adv_ops.sqrt(25) = {result}")

# 7. 使用包中的矩阵运算模块
print("\n7. 使用包中的矩阵运算模块:")
from math_utils import matrix_ops
matrix1 = [[1, 2], [3, 4]]
matrix2 = [[5, 6], [7, 8]]
result = matrix_ops.add(matrix1, matrix2)
print(f"   matrix_ops.add({matrix1}, {matrix2}) = {result}")

print("\n包的使用演示完成")